// 这里封装的是具体的接口请求方法
// 注意：每个方法只负责请求一个url地址
import request from '@/utils/request'

// 导出接口方法，为了在逻辑页面引入调用
// 以下的registerAPI后面的({ username, password, repassword })，实际上接收的是register路由组件调用这里的接口方法时传递进来的form用户信息参数，不过这里用来ES6中的解构赋值，将参数中的username、password和repassword拿了出来
export const registerAPI = ({ username, password, repassword }) => {
  // 原地是一个Promise对象(内部包含原生ajax请求)
  // return这个Promise对象到逻辑页面，去那边对Promise对象提取结果
  return request({
    url: '/api/reg',
    method: 'post',
    // axios传参params data
    // params的对象参数名和值，axios源码把参数和值拼接在 url? 后面给后台(query查询字符串)
    // data的对象参数名和值，axios源码会把参数和值拼接在请求结果里(body参数)
    data: {
      // 当变量名key和value值相等时，可以简写
      // username: username,
      // password: password,
      // repassword: repassword
      username,
      password,
      repassword
    }
  })
}

/**
 * 这种是 JSDoc注释
 * 登录接口
 * @param {*} param0 { username: 用户名, password: 密码 }
 * @returns Promise对象
 * */
// 下面的{ username, password }实际上接收的是login下的组件调用loginAPI方法传递进来的对象数据(这个数据代表的是用户的登录信息)
export const loginAPI = ({ username, password }) => {
  return request({
    url: '/api/login',
    method: 'post',
    data: {
      username,
      password
    }
  })
}

// 这个接口是为了登录后仍然能够从后台获取到用户的信息，这些个接口返回的都是一个Promise对象
export const getUserInfoAPI = () => {
  return request({
    url: '/my/userinfo'
    // method: 'get' // method不写默认就是'get'方式请求
  })
}

// 这个接口是为了获取侧边栏是数据
export const getMenusListAPI = () => {
  return request({
    url: '/my/menus'
  })
}

// 这个接口是为了更新用户基本信息资料
export const updateUserInfoAPI = ({ id, username, nickname, email, user_pic }) => { // 这里运用到了解构赋值
  return request({
    url: '/my/userinfo',
    method: 'PUT',
    data: {
      id,
      username,
      nickname,
      email,
      user_pic
    }
  })
}

// 这个接口是为了更新用户头像
export const updateUserAvatarAPI = (avatar) => {
  return request({
    url: '/my/update/avatar',
    method: 'PATCH',
    data: {
      avatar // 这里的avatar是base64格式的
    }
  })
}

// 这个接口是用来更新用户密码
export const updatePwdAPI = ({ old_pwd, new_pwd, re_pwd }) => {
  return request({
    url: '/my/updatepwd',
    method: 'PATCH',
    data: {
      old_pwd, // 旧密码
      new_pwd, // 新密码
      re_pwd // 确认新密码
    }
  })
}

// 这个接口是为了获取文章的分类
export const getArtCateListAPI = () => {
  return request({
    url: '/my/cate/list'
  })
}

// 这个接口是为了增加文章的分类
// cate_name是文章分类的名字，cate_alias是文章分类的别名
export const saveArtCateAPI = ({ cate_name, cate_alias }) => {
  return request({
    url: '/my/cate/add',
    method: 'POST',
    data: {
      cate_name,
      cate_alias
    }
  })
}

// 这个接口是为了更新修改文章的分类
// id是文章分类的id，cate_name是文章分类的名字，cate_alias是文章分类的别名
export const updateArtCateAPI = ({ id, cate_name, cate_alias }) => {
  return request({
    url: '/my/cate/info',
    method: 'PUT',
    data: {
      id,
      cate_name,
      cate_alias
    }
  })
}

// 这个接口是为了删除文章的分类
export const delArtCateAPI = (id) => {
  return request({
    url: '/my/cate/del',
    method: 'DELETE',
    params: {
      id
    }
  })
}

// 这个接口是为了发布文章
export const uploadArticleAPI = (fd) => {
  return request({
    url: '/my/article/add',
    method: 'POST',
    data: fd // 参数要的是表单对象, 不能写普通对象(如果是一个普通对象，axios会把它转换成JSON字符串在请求体中交给后台，而这种数据后端要的不是JSON形式的，而是FormData表单数据对象形式的), axios内部会判断, 如果是表单对象, 传递的请求体会设置Content-Type: form-data与后端对应
  })
}

// 这个接口是为了获取已经发布的文章列表
export const getArticleListAPI = ({ pagenum, pagesize, cate_id, state }) => {
  return request({
    url: '/my/article/list',
    params: {
      pagenum, // 当前页码
      pagesize, // 当前页需要的数据条数
      cate_id, // 文章分类id
      state // 文章状态
    }
  })
}

// 这个接口是为了获取文章详情
export const getArticleDetailFn = (id) => { // 这里的id接收的是文章的id
  return request({
    url: '/my/article/info',
    params: {
      id
    }
  })
}

// 这个接口是为了删除指定文章
export const delArticleAPI = (id) => { // 这个id是要被删除的文章的id
  return request({
    url: '/my/article/info',
    method: 'DELETE',
    params: {
      id
    }
  })
}
